ECSタスクでクロスアカウントのS3バケットを利用する手順
はじめに
ECSタスクで、AWSアカウントが分かれている (クロスアカウント) 環境で、(S3バケットに限らず) AWSリソースをしたいときってありますよね。
漏洩リスクある認証情報(アクセスキー,シークレットキー)を設定せずに実行するには、はて、どうするんだっけ、とちょっと悩んだのでまとめておきます。
本稿は弊社ブログの 別アカウントのS3バケットを利用する手順 の ECS(Fargate) バージョンです。
各アカウントで必要となるIAMロールおよびポリシーの作成方法は、このブログで説明されているものと同様のため、割愛します。
概要
今回の手順でやりたいことは、下図です。
なお、Security Token Serivce (STS)ってなあに?だったり、 AssumeRole って何だっけ、の方は、IAMロール徹底理解 〜 AssumeRoleの正体 または、IAM ロールの PassRole と AssumeRole をもう二度と忘れないために絵を描いてみた の AssumeRole とは を読むとよいでしょう。
Dockerfile
2パターンで作ります。
いちおう2つやってみましたが、わざわざコンテナにプロファイルを持つべき理由もないと思うので、1のパターンで良いと思います。
下記のDockerfile, assume_role_run.sh, config からイメージをビルドしてECRに登録します。
ECSのタスク定義を作成する際に、環境変数 AWS_CROSS_ACCOUNT_ROLE_ARN
に図のアカウントAのロールを入力して下さい。
- 公式 AWS CLI2 のコンテナイメージを元にして、CLI で一時クレデンシャルを取得してクロスアカウントのS3にアクセスする
- プロファイルを設定してクロスアカウントのS3にアクセスする
1 CLI で一時クレデンシャルを取得
## Dockerfile FROM amazon/aws-cli:latest RUN yum -y install jq COPY assume_role_run1.sh /usr/local/bin/assume_role_run1.sh WORKDIR /tmp USER nobody ENTRYPOINT ["/usr/local/bin/assume_role_run.sh1"]
## assume_role_run.sh1 #!/bin/bash CREDENTIALS=$(aws sts assume-role --role-arn $AWS_CROSS_ACCOUNT_ROLE_ARN --role-session-name demo-session --query Credentials) export AWS_ACCESS_KEY_ID=$(jq -r ".AccessKeyId" <<< "${CREDENTIALS}" ) export AWS_SECRET_ACCESS_KEY=$(jq -r ".SecretAccessKey" <<< "${CREDENTIALS}") export AWS_SESSION_TOKEN=$(jq -r ".SessionToken" <<< "${CREDENTIALS}") aws s3 ls
2 プロファイルを設定して一時クレデンシャルを取得
## Dockerfile FROM amazon/aws-cli:latest RUN mkdir -p /root/.aws/ COPY config /root/.aws/config COPY assume_role_run2.sh /usr/local/bin/assume_role_run2.sh ENTRYPOINT ["/usr/local/bin/assume_role_run2.sh"]
## config [profile demoprofile] role_arn = AWS_CROSS_ACCOUNT_ROLE_ARN credential_source = EcsContainer
## assume_role_run2.sh #!/bin/bash sed -i -e "s|AWS_CROSS_ACCOUNT_ROLE_ARN|$AWS_CROSS_ACCOUNT_ROLE_ARN|" ~/.aws/config export AWS_PROFILE=demoprofile aws s3 ls
アカウントAのS3バケットが見れましたでしょうか?
さいごに
とりあえずやることが分かっていても、数行のシェルでハマりまくって大変でした。
何でもスムーズにできるようになりたい年頃です。
以上です。
どなたかのお役に立てば幸いです。